package com.mux.java8.list;

import java.security.cert.CollectionCertStoreParameters;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collector;
import java.util.stream.Collectors;


/**
 * list 集合使用 
 * 参考地址：http://blog.csdn.net/dm_vincent/article/details/40340291
 * @author devin.chen
 *
 */
public class TestList2 {
	public static void main(String[] args) {
		final List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott");
		//遍历
		friends.forEach(name->System.out.println(name));
		friends.forEach(System.out::println);
		
		//列表的变换
		final List<String> uppercaseNames = new ArrayList<>();
		//friends.forEach(name->uppercaseNames.add(name.toUpperCase()));
		friends.stream().map(name->name.toUpperCase()).forEach(name->System.out.println(name+" "));
		//得到每个名字的长度
		friends.stream().map(name->name.length()).forEach(count->System.out.println(count));
		System.out.println(uppercaseNames);
		
		//使用方法引用
		friends.stream().map(String::toUpperCase).forEach(name->System.out.println(name));
		
		
		//寻找元素
		List<String> startWithN = friends.stream().filter(name->name.startsWith("N")).collect(Collectors.toList());
		System.out.println(startWithN.toString());
		
		
		
		//maptoint 
		System.out.println("Total number of characters in all names: " +
			    friends.stream()
			        .mapToInt(name -> name.length())
			        .sum());
		
		
		//寻找并打印一个集合中最长的名字时(长度相同时，打印第一个)，可以如下实现：
		final Optional<String> aLongName = friends.stream()
			    .reduce((name1, name2) ->
			        name1.length() >= name2.length() ? name1 : name2);
			aLongName.ifPresent(name -> System.out.println(String.format("A longest name: %s", name)));

		
		
			//以下代码为reduce方法传入了默认值：

			final String steveOrLonger =
			    friends.stream()
			        .reduce("Steve", (name1, name2) ->
			        name1.length() >= name2.length() ? name1 : name2);

			/***
			 *  元素连接
			 * 
			 * StringJoiner其实还能够对元素的连接操作进行更多的控制。比如为每个元素添加前缀，后缀然后再进行连接。具体的使用方法可以去参考API文档
			 */
			System.out.println(String.join(", ", friends));
			/**
			 * Stream类型还定义了一个collect方法用来完成一些常见的归约操作：
			 */
			
			System.out.println(friends.stream().map(String::toUpperCase).collect(Collectors.joining(", ")));

			
			
	}
	
	
	/**
	 * 打印集合中第一个符合某种条件的元素
	 * @param names
	 * @param startingLetter
	 */
	public static void pickName(
		    final List<String> names, final String startingLetter) {
		    final Optional<String> foundName = names.stream()
		        .filter(name ->name.startsWith(startingLetter))
		        .findFirst();
		    System.out.println(String.format("A name starting with %s: %s", startingLetter, foundName.orElse("No name found")));
		}
}
